package main

import (
	"math"
	"runtime"
	"time"
)

const CHUNK_SIZE = 128 * 1024 * 1024 // 128M one chunk
func main() {

	ballast := make([]byte, 1*1024*1024*1024) // 10G

	// do something
	<-time.After(time.Duration(math.MaxInt64))
	runtime.KeepAlive(ballast)
}

// 测试内存cgroup特性.
// https://www.cnblogs.com/sparkdev/p/8296063.html
func testMemCgroup() {

}

// 什么是 Go ballast，其实很简单就是初始化一个生命周期贯穿整个 Go 应用生命周期的超大 slice
// 实际用到了才会分配实际内存，默认先分配35M.
// 查看命令ps -eo pmem,comm,pid,maj_flt,min_flt,rss,vsz --sort -rss | column -t | egrep "[t]est|[P]I"， MINFL 显示出次要故障的数目，而 MAJFL 表示了主要故障的数目。
// 当进程试图访问虚拟内存中尚未分配物理页面的页面时, 即应用程序中没有加载的内存中数据,将触发页面错误。
//
//如果需要分配一个新的物理内存页，这被称为次要页面故障。
//如果内核需要从磁盘检索一页内存，则称为重大页面故障。
